package com.aier.common.common;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.KeyHolder;

public interface ICommonDAO {

    /**
     * 总数据量
     */
    String COUNT = "count";
    /**
     * 共分几页
     */
    String PAGE_COUNT = "pagecount";
    /**
     * 每页显示记录总数
     */
    String PAGE_SIZE = "pagesize";
    /**
     * 当前页数
     */
    String PAGE = "page";
    /**
     * 获取对象列表
     */
    String OBJ_LIST = "objList";

    /**
     * 执行数据库写入操�?
     * @param table 表名
     * @param par �?��写入的参�?Map类型 key="字段"<String>,value=写入对象<Object>
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int insert(String table, Map<String, Object> par);

    /**
     * 执行数据库写入操�?
     * @param table 表名
     * @param par �?��写入的参�?Map类型 key="字段"<String>,value=写入对象<Object>
     * @param type �?��写入的参数类�?Map类型 key="字段"<(String>,value=类型<Integer>
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int insert(String table, Map<String, Object> par,
	    Map<String, Integer> type);
    
    /**
     * 执行数据库写入操�?
     * @param pc 
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int insert(PreparedStatementCreator pc);	        	 

    /**
     * 执行数据库写入操作并返回主键对象
     * @param pc
     * @param keyHolder
     * @return 执行成功则返回主键对�?如果失败则返回null
     */
    KeyHolder insert(PreparedStatementCreator pc,KeyHolder keyHolder);
    
    /**
     * 执行数据库写入或更新操作(主键存在则进行更�?
     * @param table 表名
     * @param par �?��写入的参�?Map类型 key="字段"<String>,value=写入对象<Object>
     * @param upPar �?��更新的参�?List<String>="字段�?
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int insertSave(String table,Map<String, Object> par,List<String> upPar);
    
    /**
     * 数据库更新操�?
     * @param table 表名
     * @param par �?��更新的参�?Map类型 key="字段"<String>,value=写入对象<Object>
     * @param args 数据库搜索条件参�?Map类型 key="字段"<String>,value=写入对象<Object>
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int update(String table, Map<String, Object> par,
	    Map<String, Object> args);
    
    /**
     * 执行sql语句
     * @param sql
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int update(String sql);
    
    /**
     * 执行sql语句
     * @param sql 
     * @param args 执行sql语句的条件参数�?
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int update(String sql, Object[] args);

    /**
     * 执行sql语句
     * @param sql
     * @param args 执行sql语句的条件参数�?
     * @param types 执行sql语句的条件参数类�?
     * @return 返回成功执行sql语句条数,如果�?则执行失�?
     */
    int update(String sql, Object[] args, int[] types);

    /**
     * 批量查询数据库语�?
     * @param sql
     * @return 
     */
    List<?> list(String sql);

    /**
     * 批量查询数据库语�?
     * @param sql
     * @param args 执行sql语句的条件参数�?
     * @return
     */
    List<?> list(String sql, Object[] args);

    /**
     * 批量查询数据库语�?
     * @param sql
     * @param mapper 格式化成指定的对�?
     * @return 
     */
    List<?> list(String sql, RowMapper<?> mapper);

    /**
     * 查询出单条记�?
     * @param sql
     * @param args 执行sql语句的条件参数�?
     * @param mapper 格式化指定对�?
     * @return
     */
    Object listByObject(String sql, Object[] args, RowMapper<?>  mapper);
    /**
     * 查询单条记录
     * @param sql 
     * @param mapper 映射对象辅助�?
     * @return
     */
    Object listByObject(String sql,RowMapper<?>  mapper);
    /**
     * sql多条语句查询
     * @param sql
     * @param args 执行sql语句的条件参数�?
     * @param mapper 格式化指定对�?
     * @return
     */
    List<?> list(String sql, Object[] args, RowMapper<?>  mapper);

    /**
     * 分页查询
     * @param sql
     * @param page 获取第几�?
     * @param pagesize 每页显示条数
     * @param args 执行sql语句的条件参数�?
     * @param mapper 格式化成指定的对�?
     * @return
     */
    Map<String, Object> queryPage(String sql, int page, int pagesize,
	    Object[] args, RowMapper<?>  mapper);
    
    /**
     * 分页查询
     * @param sql
     * @param page 获取第几�?
     * @param pagesize 每页显示条数
     * @param args 执行sql语句的条件参数�?
     * @param mapper 格式化成指定的对�?
     * @return
     */
    Map<String, Object> queryPage(String sql, int page, int pagesize,
	    List<Object> args, RowMapper<?>  mapper);
    
    /**
     * 查询记录总数
     * @param sql
     * @param args
     * @return
     */
    int countByQuali(String sql, Object[] args);
    
    /**
     * 返回jdbcTemplate
     * @param sql
     * @param args
     * @return
     */
    JdbcTemplate getJDBCTemplate();
}
